{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from math import ceil\n",
    "import torch\n",
    "from torch.utils.data import DataLoader\n",
    "from torch.autograd import Variable\n",
    "import torch.optim as optim\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "import sys\n",
    "sys.path.append('..')\n",
    "from utils.input_pipeline import get_image_folders\n",
    "from utils.training import train\n",
    "from utils.quantization import optimization_step, quantize, initial_scales\n",
    "\n",
    "torch.cuda.is_available()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "torch.backends.cudnn.benchmark = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "LEARNING_RATE = 1e-4  # learning rate for all possible weights\n",
    "HYPERPARAMETER_T = 0.15  # hyperparameter for quantization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Create data iterators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 512"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100000"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_folder, val_folder = get_image_folders()\n",
    "\n",
    "train_iterator = DataLoader(\n",
    "    train_folder, batch_size=batch_size, num_workers=4,\n",
    "    shuffle=True, pin_memory=True\n",
    ")\n",
    "\n",
    "val_iterator = DataLoader(\n",
    "    val_folder, batch_size=256, num_workers=4,\n",
    "    shuffle=False, pin_memory=True\n",
    ")\n",
    "\n",
    "# number of training samples\n",
    "train_size = len(train_folder.imgs)\n",
    "train_size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from get_squeezenet import get_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "model, loss, optimizer = get_model(learning_rate=LEARNING_RATE)\n",
    "\n",
    "# load pretrained model, accuracy ~52%\n",
    "model.load_state_dict(torch.load('../vanilla_squeezenet/model.pytorch_state'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### keep copy of full precision kernels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# copy almost all full precision kernels of the model\n",
    "all_fp_kernels = [\n",
    "    Variable(kernel.data.clone(), requires_grad=True) \n",
    "    for kernel in optimizer.param_groups[1]['params']\n",
    "]\n",
    "# all_fp_kernels - kernel tensors of all convolutional layers \n",
    "# (with the exception of the first conv layer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### initial quantization "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# scaling factors for each quantized layer\n",
    "initial_scaling_factors = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# these kernels will be quantized\n",
    "all_kernels = [kernel for kernel in optimizer.param_groups[1]['params']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for k, k_fp in zip(all_kernels, all_fp_kernels):\n",
    "    \n",
    "    # choose initial scaling factors \n",
    "    w_p_initial, w_n_initial = initial_scales(k_fp.data)\n",
    "    initial_scaling_factors += [(w_p_initial, w_n_initial)]\n",
    "    \n",
    "    # do quantization\n",
    "    k.data = quantize(k_fp.data, w_p_initial, w_n_initial, t=HYPERPARAMETER_T)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### parameter updaters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# optimizer for updating only all_fp_kernels\n",
    "optimizer_fp = optim.Adam(all_fp_kernels, lr=LEARNING_RATE)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# optimizer for updating only scaling factors\n",
    "optimizer_sf = optim.Adam([\n",
    "    Variable(torch.FloatTensor([w_p, w_n]).cuda(), requires_grad=True) \n",
    "    for w_p, w_n in initial_scaling_factors\n",
    "], lr=LEARNING_RATE)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "196"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n_epochs = 10\n",
    "n_batches = ceil(train_size/batch_size)\n",
    "\n",
    "# total number of batches in the train set\n",
    "n_batches"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0  17.403 12.707  0.223 0.231  0.471 0.475  116.700\n",
      "1  8.803 6.580  0.240 0.240  0.492 0.498  123.032\n",
      "2  5.118 3.968  0.223 0.238  0.471 0.493  112.761\n",
      "3  3.746 3.387  0.235 0.276  0.486 0.540  112.560\n",
      "4  3.373 3.207  0.263 0.293  0.526 0.557  112.431\n",
      "5  3.164 3.146  0.293 0.304  0.562 0.569  112.807\n",
      "6  3.038 3.080  0.313 0.319  0.586 0.586  112.461\n",
      "7  2.944 3.097  0.330 0.308  0.603 0.576  112.531\n",
      "8  2.872 3.177  0.343 0.305  0.616 0.570  112.617\n",
      "9  2.809 2.844  0.352 0.356  0.626 0.628  112.724\n",
      "CPU times: user 19min 58s, sys: 3min 11s, total: 23min 10s\n",
      "Wall time: 19min\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "def optimization_step_fn(model, loss, x_batch, y_batch):\n",
    "    return optimization_step(\n",
    "        model, loss, x_batch, y_batch, \n",
    "        optimizer_list=[optimizer, optimizer_fp, optimizer_sf],\n",
    "        t=HYPERPARAMETER_T\n",
    "    )\n",
    "all_losses = train(\n",
    "    model, loss, optimization_step_fn,\n",
    "    train_iterator, val_iterator, n_epochs\n",
    ")\n",
    "# epoch logloss  accuracy    top5_accuracy time  (first value: train, second value: val)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Loss/epoch plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEKCAYAAAAfGVI8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8VOW97/HPbyYzkwsJJCQBJWACQgIooAQ3aq2JWmu1\nFW1FbNXa6qmv3Xb34qnHanf3abu3+2xPq+e0Pb14aL22Hq2irba11a0CVitqUBDkKvegkIR7Qi6T\nzHP+WAME5DKZzCWZ+b5fr3nNzJp1+WVekG/Wep71POacQ0REspcv3QWIiEh6KQhERLKcgkBEJMsp\nCEREspyCQEQkyykIRESynIJARCTLJS0IzOx+M2sys+W9lk0zs0VmtsTMGszsrGQdX0REYpPMM4IH\ngUuOWPZD4AfOuWnAf4++FxGRNMpJ1o6dcy+bWeWRi4Gi6OuhwPux7Ku0tNRVVh65KxEROZ7Fixe3\nOOfKTrRe0oLgGL4JPGdmd+OdjZwTy0aVlZU0NDQktTARkUxjZptiWS/VjcVfBm5xzo0GbgHuO9aK\nZnZztB2hobm5OWUFiohkm1QHwQ3AU9HXTwDHbCx2zs11ztU652rLyk54ZiMiInFKdRC8D5wffX0B\nsDbFxxcRkSMkrY3AzB4F6oBSM2sEvgd8CfiJmeUAHcDNyTq+iGS3cDhMY2MjHR0d6S4l6XJzc6mo\nqCAQCMS1fTJ7DX32GB9NT9YxRUQOaGxspLCwkMrKSsws3eUkjXOOHTt20NjYSFVVVVz70J3FIpKR\nOjo6GD58eEaHAICZMXz48H6d+SgIRCRjZXoIHNDfnzOjg2DB6iZ+Pv+9dJchIjKgZXQQ/H3dDn78\nwhpaO7vTXYqIZKHdu3fzi1/8os/bXXrppezevTsJFR1dRgdBfXU54R7Hq++1pLsUEclCxwqC7u7j\n/3H67LPPMmzYsGSV9SEZHQS1lcUMCeUwf1VTuksRkSx0++23s27dOqZNm8aMGTM477zzuPzyy5k0\naRIAV1xxBdOnT2fy5MnMnTv34HaVlZW0tLSwceNGJk6cyJe+9CUmT57MxRdfTHt7e8LrTPVYQykV\n8Ps4b3wp81c34ZzLmoYjETncD/74Live35vQfU46uYjvfWrycde56667WL58OUuWLGHBggVcdtll\nLF++/GA3z/vvv5+SkhLa29uZMWMGn/nMZxg+fPhh+1i7di2PPvoov/rVr7j66qt58sknue666xL6\ns2T0GQFAfU052/d2svKDfekuRUSy3FlnnXVYX/+f/vSnTJ06lZkzZ7JlyxbWrv3wYAtVVVVMmzYN\ngOnTp7Nx48aE15XRZwQAdRO8cYrmr25i0slFJ1hbRDLRif5yT5WCgoKDrxcsWMALL7zAa6+9Rn5+\nPnV1dUe9FyAUCh187ff7k3JpKOPPCMqLcjltVJHaCUQk5QoLC9m37+hXI/bs2UNxcTH5+fmsWrWK\nRYsWpbi6QzL+jADggupyfjb/PXbv72JYfjDd5YhIlhg+fDjnnnsup512Gnl5eYwYMeLgZ5dccgn3\n3nsvEydOpLq6mpkzZ6atTnPOpe3gsaqtrXX9mZjmrc27+PQv/s5PrpnGrGmjEliZiAxUK1euZOLE\niekuI2WO9vOa2WLnXO2Jts34S0MAUyuGUVIQZMFqTXAjInKkrAgCv884f0IZC9c00xMZ+GdAIiKp\nlBVBAFBXXcbOti7eaUzdbdsiIoNB1gTB+RPK8BnqPSQicoSsCYJh+UHOHFPMfLUTiIgcJmuCALy7\njJdt3UPTvsyfuk5EJFZZFQR11d5dxuo9JCID0ZAhQ9Jy3KQFgZndb2ZNZrb8iOVfM7NVZvaumf0w\nWcc/mkknFTGiKMSC1WonEBE5IJl3Fj8I/Ax4+MACM6sHZgFTnXOdZlaexON/iJlRX13On9/5gHBP\nhIA/q06IRCTFbr/9dkaPHs1Xv/pVAL7//e+Tk5PD/Pnz2bVrF+FwmDvvvJNZs2altc6kBYFz7mUz\nqzxi8ZeBu5xzndF1Uv6neV11OY+9uYWGjbs4e9zwE28gIoPfX26HbcsSu8+Rp8Mn7jruKnPmzOGb\n3/zmwSB4/PHHee655/j6179OUVERLS0tzJw5k8svvzytw+Sn+k/iCcB5Zva6mS00sxnHWtHMbjaz\nBjNraG5O3DX9j4wvJeA3XR4SkaQ744wzaGpq4v3332fp0qUUFxczcuRIvvOd7zBlyhQuuugitm7d\nyvbt29NaZ6oHncsBSoCZwAzgcTMb644y4JFzbi4wF7yxhhJVwJBQDmdVlTB/dRN3XJo945CIZLUT\n/OWeTLNnz2bevHls27aNOXPm8Mgjj9Dc3MzixYsJBAJUVlYedfjpVEr1GUEj8JTzvAFEgNIU10B9\ndTlrtrfSuGt/qg8tIllmzpw5PPbYY8ybN4/Zs2ezZ88eysvLCQQCzJ8/n02bNqW7xJQHwR+AegAz\nmwAEgZTPLF9X7bVR6+YyEUm2yZMns2/fPkaNGsVJJ53EtddeS0NDA6effjoPP/wwNTU16S4xeZeG\nzOxRoA4oNbNG4HvA/cD90S6lXcANR7sslGzjygoYU5LPglVNXD/zlFQfXkSyzLJlhxqqS0tLee21\n1466Xmtra6pKOkwyew199hgfJXbW5Th43UjL+F3DFjrCPeQG/OkuSUQkbbK2I31dTTkd4QiL1u9I\ndykiImmVtUFw9tjh5AZ8Gm5CJIMNhhkYE6G/P2fWBkFuwM8540p5aVVT1vxjEckmubm57NixI+P/\nfzvn2LFjB7m5uXHvIysmrz+W+uoyXlrVxPqWNsaVpWewJxFJjoqKChobG0nkDakDVW5uLhUVFXFv\nn9VB4HUjfZf5q5oUBCIZJhAIUFVVle4yBoWsvTQEMLokn/HlQ5iv4SZEJItldRCAN1nNGxt20trZ\nne5SRETSQkFQXU64x/Hqeym/wVlEZEDI+iCorSxmSChHk9qLSNbK+iAI+H2cN76U+avVjVREslPW\nBwF47QTb93ay8oN96S5FRCTlFARA3QRvUnv1HhKRbKQgAMqLcjltVJHaCUQkKykIoi6oLuetzbvY\nvb8r3aWIiKSUgiCqrqaciIOFazL/dnQRkd4UBFFTK4ZRUhDUaKQiknUUBFF+n3H+hDIWrmmmJ6Ju\npCKSPRQEvdRVl7GzrYuljbvTXYqISMokLQjM7H4za4rOT3zkZ98yM2dmpck6fjzOn1CGz2CBeg+J\nSBZJ5hnBg8AlRy40s9HAxcDmJB47LsPyg5w5ppj5aicQkSyStCBwzr0M7DzKR/8buA0YkBfi62vK\nWbZ1D037OtJdiohISqS0jcDMZgFbnXNLY1j3ZjNrMLOGVM4wVFft3WWs3kMiki1SFgRmlg98B/jv\nsazvnJvrnKt1ztWWlZUlt7heJp1UxIiiEAs03ISIZIlUnhGMA6qApWa2EagA3jKzkSms4YTMjPrq\ncv62poVwTyTd5YiIJF3KgsA5t8w5V+6cq3TOVQKNwJnOuW2pqiFWddXl7OvspmHjrnSXIiKSdMns\nPvoo8BpQbWaNZnZTso6VaB8ZX0rAb7o8JCJZIZm9hj7rnDvJORdwzlU45+474vNK59yAnB9ySCiH\ns6pKNCy1iGQF3Vl8DPXV5azZ3krjrv3pLkVEJKkUBMdQX1MOoJvLRCTjKQiOYWxpAWNK8jXchIhk\nPAXBMXjdSMt4dV0LHeGedJcjIpI0CoLjqK8ppyMcYdH6HekuRUQkaRQExzFz7HByAz4NNyEiGU1B\ncBy5AT/njCvlpVVNODcgx8gTEek3BcEJ1NeUs3nnfta3tKW7FBGRpFAQnEDdBG/Au/nqPSQiGUpB\ncAKjS/IZXz5EdxmLSMbK/CDo7uz3Li6oKeeNDTtp7exOQEEiIgNLZgfBC9+HufXQz4beuupywj2O\nV98bkEMjiYj0S2YHwfDx0PQubPp7v3ZTW1lMYShH7QQikpEyOwgmXwm5Q6Hh/n7tJuD3cd6EUuav\nVjdSEck8mR0EwXyY+jlY8TS09u+msLrqcrbv7WTlB/sSVJyIyMCQ2UEAUHsjRMKw5Lf92s2BSe3V\ne0hEMk3mB0HZBKg8DxoegEj8cxCXF+Zy+qihaicQkYyT+UEAUPtF2L0J1r3Ur93UV5fx1uZd7N7f\nlaDCRETSL5lzFt9vZk1mtrzXsh+Z2Soze8fMfm9mw5J1/MPUfAoKyvrdaFxXU07EwcI1GoRORDJH\nMs8IHgQuOWLZfwKnOeemAGuAO5J4/ENygnDG9bDmL7Bna9y7mVoxjJKCoEYjFZGMkszJ618Gdh6x\n7Hnn3IHbcxcBFck6/odMv8G7seyth+Lehd9nnD+hjIVrmumJqBupiGSGdLYR3Aj85VgfmtnNZtZg\nZg3NzQn4C7y4Ek69CBY/BD3huHdTV13GzrYuljbu7n9NIiIDQFqCwMz+GegGHjnWOs65uc65Wudc\nbVlZWWIOPOMmaN0Ga/4a9y7On1CGz9BcxiKSMVIeBGb2BeCTwLUu1bfpjr8Yiirgzfvi3sWw/CBn\njilmvtoJRCRDpDQIzOwS4Dbgcufc/lQeGwCf32srWD8fdqyLezf1NeUs27qHpr0dCSxORCQ9ktl9\n9FHgNaDazBrN7CbgZ0Ah8J9mtsTM7k3W8Y/pzM+D+WHxg3Hvor66HIAF6kYqIhkgmb2GPuucO8k5\nF3DOVTjn7nPOneqcG+2cmxZ9/GOyjn9MhSOh5jJ4+7cQju8v+oknFTKiKMQCDTchIhkgO+4sPlLt\njdC+E1Y+E9fmZkZ9dTl/W9NCuCf+YStERAaC7AyCqvOhZFy/7jSurylnX2c3DRt3JbAwEZHUy84g\n8Pm88Yc2vwbb341rF+eeWkrAb7o8JCKDXnYGAcC0a8Ef8kYljcOQUA5nVZVoWGoRGfSyNwjyS7wZ\nzJY+Bp2tce2ivrqcNdtbadyV+p6wIiKJkr1BAF6jcdc+WD4vrs3ra7xupLq5TEQGs+wOgtFnQflk\n707jOG5yHltawJiSfA03ISKDWnYHgRnMuBG2vQPvvxXH5sYFNeW8uq6FjnBPEgoUEUm+7A4CgNOv\nhkABvBlfV9K66jI6whEWrd+R4MJERFJDQZBbBFNmw/Inob3v9wTMHDuc3IBPk9WIyKClIACv0bi7\nHZb+rs+b5gb8nDuulJdWNZHqwVRFRBJBQQBw0lQYVevdaRzHL/O6mnI279zP+pa2JBQnIpJcCoID\nam+EltWw6dU+b1pf7U2cM1+9h0RkEIopCMzsG2ZWZJ77zOwtM7s42cWl1GmfhtyhcY0/VFGcz4QR\nQ3SXsYgMSrGeEdzonNsLXAwUA9cDdyWtqnQI5HnDTqx4Blr7/gu9vrqcNzbspLWzOwnFiYgkT6xB\nYNHnS4HfOOfe7bUsc0z/IkTC3lwFfVRXXU64x/Hqey1JKExEJHliDYLFZvY8XhA8Z2aFQOYNxF82\nASrPg8UPQKRvP15tZTGFoRy1E4jIoBNrENwE3A7MiM41HAC+mLSq0qn2Rti9Gda92KfNAn4f500o\nZf5qdSMVkcEl1iA4G1jtnNttZtcB3wX2HG8DM7vfzJrMbHmvZSVm9p9mtjb6XBx/6UlS80koKI+r\n0biuupzteztZ+cG+JBQmIpIcsQbBL4H9ZjYV+BawDnj4BNs8CFxyxLLbgRedc+OBF6PvB5acIJx5\nPaz5K+xp7NOmdQe6kar3kIgMIrEGQbfzrnfMAn7mnPs5UHi8DZxzLwM7j1g8C3go+voh4Io+1Jo6\nZ97g3Vi2+KETr9tLeWEup48aqnYCERlUYg2CfWZ2B1630T+bmQ+vnaCvRjjnPoi+3gaMiGMfyVd8\nCoz/GLz1MPSE+7RpfXUZb23exe79XUkqTkQksWINgjlAJ979BNuACuBH/Tlw9AzjmK2qZnazmTWY\nWUNzcxoGdKu9EVq3weq/9GmzuppyIg4WrtEgdCIyOMQUBNFf/o8AQ83sk0CHc+5EbQRHs93MTgKI\nPh/zGopzbq5zrtY5V1tWVhbHofpp/MVQVAEN9/Vps6kVwygpCGo0UhEZNGIdYuJq4A1gNnA18LqZ\nXRXH8Z4Bboi+vgF4Oo59pIbPD9O/AOsXwI51MW/m9xnnTyhj4ZpmeiLqRioiA1+sl4b+Ge8eghuc\nc58HzgL+5XgbmNmjwGtAtZk1mtlNeMNSfMzM1gIXMdCHqTjzevDleDeY9UFddRk727pY2rg7SYWJ\niCROTozr+ZxzvS/j7OAEIeKc++wxProwxmOmX+FIqLkM3n4E6r8LgdyYNjt/Qhk+gwWrmjhzzMC7\nVUJEpLdYzwj+ambPmdkXzOwLwJ+BZ5NX1gBSeyO074QVsV/FGpYf5MwxxcxXO4GIDAKxNhb/N2Au\nMCX6mOuc+3YyCxswKj8KJeP6fKdxfU05y7buoWlvR5IKExFJjJgnpnHOPemc+6/Rx++TWdSA4vN5\nZwVbFsH2d2PerL66HIAF6kYqIgPccYPAzPaZ2d6jPPaZ2d5UFZl20z4H/lCfzgomnlTIiKIQCzTc\nhIgMcCdq8C10zhUd5VHonCtKVZFpl18Ck6/0JrfvbI1pEzOjvrqcv61pIdyTeSN2i0jm0JzFsZpx\nE3Ttg2VPxLxJfU05+zq7adi4K4mFiYj0j4IgVhUzYMRp3uWhGOcbOPfUUgJ+0+UhERnQFASxMoPa\nL8K2d2DrWzFtMiSUw1lVJbyk0UhFZABTEPTFlDkQHNKn8Yfqq8tZ29TKlp37k1iYiEj8FAR9ESqE\n02fD8iehPbbr/vU16kYqIgObgqCvam+E7g5Y+lhMq48tLWBMST5/eHsrEQ1CJyIDkIKgr06a4jUc\nx9hobGZ8pW4cizft4jeLNqWgQBGRvlEQxKP2RmhZAxtfiWn1OTNGU1ddxl1/WcXGlrYkFyci0jcK\ngnhMvhJyh8V8p7GZcdenpxDwG7c+sVTzFIjIgKIgiEcgD6ZdCyv/CK2xdQ0dOTSXH8yaTMOmXdz3\nyvokFygiEjsFQbxqvwiRMLz9m5g3uWLaKC6eNIK7n1/D2u37kliciEjsFATxKh0PlefB4gch0hPT\nJmbGv195OkNCOXzriaV0awwiERkAFAT9MeMm2L0Z3nsx5k3KCkPcecVpvNO4h18uiH0uZBGRZElL\nEJjZLWb2rpktN7NHzSy2OSAHmurLoKC8z5PWXHr6SVw+9WR+8uJa3n1/T5KKExGJTcqDwMxGAV8H\nap1zpwF+4JpU15EQOUFvgvu1z8HuLX3a9F9nTaa4IMi3Hl9KZ3dsl5ZERJIhXZeGcoA8M8sB8oH3\n01RH/03/gndj2VsP9WmzYflB7vr06azato+fvrg2ObWJiMQg5UHgnNsK3A1sBj4A9jjnnk91HQkz\nbAyMvxjeehh6wn3a9MKJI5g9vYJfLljHki27k1SgiMjxpePSUDEwC6gCTgYKzOy6o6x3s5k1mFlD\nc/MAH7Ct9kZo3Q6rn+3zpv/yqUmMLMrlW48voSOsS0QiknrpuDR0EbDBOdfsnAsDTwHnHLmSc26u\nc67WOVdbVlaW8iL7ZPzHYOhoeDP24akPKMoN8MOrprKuuY27n1udhOJERI4vHUGwGZhpZvlmZsCF\nwMo01JE4Pj9MvwE2LISW9/q8+UfGl3LdzDHc9+oG3tiwMwkFiogcWzraCF4H5gFvAcuiNcxNdR0J\nd8b14MuBxQ/Etfkdn5jI6OJ8bn1iKW2d3QkuTkTk2NLSa8g59z3nXI1z7jTn3PXOuc501JFQhSOh\n5jJY8giE2/u8eUEoh7tnT2XLrv3c9ZdVSShQROTodGdxItXe5M1ctuLpuDY/q6qEm86t4jeLNvHK\n2pYEFycicnQKgkSq+igMP7XPdxr3duvHqxlXVsBt85ayt6Nv3VFFROKhIEgkM5j+RdjyOmxbHtcu\ncgN+7p49lW17O/i3P65IcIEiIh+mIEi0aZ8Df6hfZwVnjCnmy3XjeGJxIy+u3J7A4kREPkxBkGj5\nJXDap+Gd30Fn/HMOfP3C8dSMLOT2p5axq60rgQWKiBxOQZAMtTdCVysseyLuXYRy/Nxz9VR2tXXx\nvWfeTWBxIiKHUxAkQ8UMGHE6vHm/NyBdnCafPJSvXzieZ5a+z7PLPkhggSIihygIksHMm8py+zLY\nurhfu/py3TimVAzlu39YTkvr4L/dQkQGHgVBsky5GoJD4hp/qLeA38c9s6fS2tnNd55ahuvHGYaI\nyNEoCJIlVOiFwbtPwf7+jR80fkQht148gedXbOcPS7YmqEAREY+CIJlqb4TuDlj6WL93ddNHxlJ7\nSjHfe/pdtu3pSEBxIiIeBUEyjTzdazhu6F+jMYDfZ/xo9lS6eiJ8+8l3dIlIRBJGQZBstTfBjrWw\n8W/93lVVaQF3fGIiC9c087s3+zZHsojIsSgIkm3yFZA7DF7+UZ+nsjya62eewtljh/Nvf1rBlp37\nE1CgiGQ7BUGyBfLgou/DhpfhqZsh0r/pKH0+44dXTcHMuG3eO0QiukQkIv2jIEiF2i/CRT/wehA9\n83WIRPq1u9El+Xz3som8tn4HD7+2MSElikj2UhCkyke+Ced/G5b8Fv767X43Hs+ZMZq66jLu+usq\nNrS0JahIEclGCoJUqrsDzv4neGMuvPD9foWBmfE/PzOFoN/HrU8spUeXiEQkTmkJAjMbZmbzzGyV\nma00s7PTUUfKmcHFd3r3F7z6Y3j57n7tbkRRLj+YNZnFm3bx67+tT1CRIpJt0nVG8BPgr865GmAq\nsDJNdaSeGVx6D0y5BubfCa/9vF+7u2LaKD4+eQT3PL+GNdvjH/ZaRLJXyoPAzIYCHwXuA3DOdTnn\ndqe6jrTy+WDWz2HSLHjuO9DwQNy7MjP+/crTGZKbw7ceX0q4p38N0SKSfdJxRlAFNAMPmNnbZvZr\nMytIQx3p5c+BT/8axn8c/nQLLP1d3LsqHRLizitOY9nWPfxywboEFiki2SAdQZADnAn80jl3BtAG\n3H7kSmZ2s5k1mFlDc3NzqmtMjZwgXP0QVJ0Hf/hHWPF03Lu69PSTuHzqyfz0xbUs37ongUWKSKZL\nRxA0Ao3Oudej7+fhBcNhnHNznXO1zrnasrKylBaYUoE8uOZRb0yieTfBmufj3tW/zppMcUGQW59Y\nSmd3/25cE5HskfIgcM5tA7aYWXV00YXAilTXMaCEhsC1T8CISfD49d5dyHEYlh/kf37mdFZt28dP\nXlib4CJFJFOlq9fQ14BHzOwdYBrwP9JUx8CROxSu+z0UV8H/uwY2v37ibY7igpoRXF1bwb0L1/H2\n5l0JLlJEMlFagsA5tyR62WeKc+4K55x+YwEUDIfP/wEKR8Ajs+H9JXHt5rufnMTIoly+9cRSOsK6\nRCQix6c7iweawpHw+Wcgtwh+cyU09f0Wi6LcAD+8airrm9v40XOrk1CkiGQSBcFANGw0fP5p8Afh\n4Vmwo+9dQj8yvpTrZ57C/a9u4PX1O5JQpIhkCgXBQDV8nBcGkW4vDHZv7vMubv9EDaOL87l13lLa\nOruTUKSIZAIFwUBWXgPX/x469nphsG9bnzYvCOVw9+ypNO5q5z/+kj2jeIhI3ygIBrqTpsJ182Df\ndi8M2vp2meesqhJuOreK3y7azN/WZuiNeSLSLwqCwWD0WfC538GujfCbK6C9b0Mz3frxasaVFXDb\nvHfY29H/6TJFJLMoCAaLqvNgzm+9XkSPzIbO1pg3zQ34uefqaWzf28FnfvF3Xlq1HdfPiXFEJHMo\nCAaT8R+Dq+6HrYvh0Wsg3B7zptNGD+NXn68l3BPhxgcb+NyvXmdZo8YkEhEFweAz6XK48l7Y+Ao8\n/nno7op50wsnjuD5W87n+5+axOrt+/jUz17hG4+9zZad+5NYsIgMdDYYLhHU1ta6hoaGdJcxsCx+\nEP74DZh4OVz1gDesdR/s7Qhz74J13PfKBpyDG845hX+qH8/Q/EBy6hWRlDOzxc652hOtpzOCwWr6\nF+Dj/wErn4GnvwKRvk1IU5Qb4LZLaph/ax2fmnoyv35lAx/90Xx+/bf1GrlUJMsoCAazs78CF3wX\n3vkd/Pm/QhxndycPy+Oeq6fy56+dx5SKodz555VceM9Cnl6ylUhk4J8tikj/KQgGu/NuhY/cAosf\ngOf+Oa4wAJh0chG/uekfePjGsxgSyuEbjy3hil+8yiINTyGS8fp2YVkGHjO48HteD6JFP4dgAVzw\nz3Hv7qMTyjj31FJ+//ZW7nl+NdfMXcSFNeXc/okaxo8oTGDhIjJQKAgygZnXXtDVBi//EIL53llC\nnPw+46rpFXxyyknc/+oGfjl/HR//8cvMmTGGWz42nvLC3AQWLyLppiDIFD4ffOon3pnBC9+HQAH8\nw8392mVuwM9X6k5lTu1o/s9L7/HbRZt4eslWvnTeWG7+6FgKQvrnI5IJ1H000/SE4fEbYPWf4fKf\nwZnXJ2zXG1va+OFzq3h22TbKCkPcctEErq6tIMevpiaRgUjdR7OVPwCzH4BxF8AzX4Nl8xK268rS\nAn5x7XSe/PI5jCnJ5zu/X8YlP/kbL6zQkBUig1nagsDM/Gb2tpn9KV01ZKycEMx5BE45B566GVb9\nOaG7n35KMfP+8WzuvW46PRHHf3m4gWvmLuKdxr4NhiciA0M6zwi+AWiQ/GQJ5nsjlp48DZ74Arz3\nYkJ3b2ZcctpInr/lo/zbrMm819TK5T97la89qiErRAabtASBmVUAlwG/Tsfxs0aoEK57Ekqr4bFr\nYeOrCT9EwO/j+rMrWfDf6vin+lP5zxXbuPCehdz5pxXs3h/7OEgikj7pOiP4MXAb0LdxEaTv8oq9\nWc6GjYb/dzW8eR80r477xrNjKcwNcOvHq1lwaz1XnHEy9726gY/+cD5zX15HR1hDVogMZCnvNWRm\nnwQudc59xczqgFudc588yno3AzcDjBkzZvqmTZtSWmfG2fs+PHwFtKz23ueVwOh/gDEzvcfJZ3ht\nCwmyatte/uPZVSxc08yoYXncdkk1n5pyMj6fJewYInJ8sfYaSkcQ/AdwPdAN5AJFwFPOueuOtY26\njyaIc7DjPdi8yHtsWeS9B/CHvDAYMxPGnO3NipZf0u9DvrK2hf/x7EpWfLCX00cN5Y5LazhnXGm/\n9ysiJzYEPrJjAAAMKElEQVRgg+Cwgx/njKA3BUEStTbDltdh82ve8/tLIBKdzrKsJnrWcDaM+Qco\nrvLuYu6jSMTxhyVbufu51by/p4P66jIunDiCsaUFVJUVMLIoF4tjvyJyfAoCiU/Xfnj/rV5nDW9A\nZ3QmsyEjDg+GkVO8+xZi1BHu4cG/b+TehevYvf/Q3Ml5AT9V0VAYW1pAVWkBY8uGUFVawNA8zY8g\nEq9BEQSxUhCkUSQCzSsPv5y0e7P3WSAfRk2PBsNMqJgBuUUn3KVzjm17O9jQ3Mb6ljY2tLSxvrmV\nDS1tbNnVTk+v4a+HFwQZW+aFQ1WpFw7jygoYMzyfUI4/WT+1SEZQEEjy7H3/UDBsfg22LwcXAfPB\niMkweuahRuihFX3adVd3hM0797OhpY0NLa2s7xUWzfs6D67nMxhVnEdV6RDGlhb0CosCTh6ap0Zp\nERQEkkqd+6DxTdgcbWtobIBwm/fZ0NGH904qnwS++P6S39cRjgZEW6+AaGVDcxttXYe6qIZyfAdD\nwQsI70xibGkBxQXBRPzEIoOCgkDSp6cbti87FAybF0HrNu+zUBFU1ELRKK9XUl6x15U1r/jD7wOx\nDXftnKN5XyfrmtsOO5PY0NLG5p376e51qak4P3DwMlPl8HzKCkOUFAQZPiTE8IIgw4cEGRLKUeO1\nZAQFgQwczsHuTYcuJ21t8Horte+EnuPcfRzI7xUMw04cHPklkDsMcg791R/uibDl4KUm7yziQHvE\n9r2dRz1s0O+LhkOQkoIgpUO8sPBeBykpCDF8SJDh0WUKDhmoYg0CDSgvyWcGxZXeY+o1h5Y7B+H9\n0L4L9u/0ntt3HvF+16H3TasOfR7pPvbxgoXRYCgmkFfM2LwSxh4IipHFUOUFR2dgGHvCfnZ3ws5O\n2Nlh7OxwtLQ7mvd7j6a2Tja0tLGzrYv9XUe/QzqY4zt4NlFSEKI0GhAlQ4KUFoQOhsrwghAlQ4IU\nBP0KDhlQFASSPmbe1JrBgr41KjvntUscDIre4bH7w2Gyp/HQuu7QqCYhoDz6OC5fDoSCuPwAEV+Q\nHgvQbTl0k0MXAbqcn45IDh1tPvbvzWF/j4+2bh8dzk+XC7ANP1vIoSu6vrMAgWCIQCiXYPSREwiR\nE8wlJ5hLIJRLKBQiGMojmJtHbm4euaE88vLyyc/LIy8/n1AohOXkgj8Y170dg1pPN3R39Hp0Hnod\nPnJZJ3S3H/E++hw+2vIDjy4oKD30B8yBR0kV5A5N78+fBAoCGXzMvG6quUVQfErs20Ui0Ln3UFC0\n7/Ym8unpjD53eb8QDrw+4mE9Yfzdnfh7wgSP8jndB153Qk8Xke5OIt1duO4D23fhc2F8rgd6gP3R\nRz91kRMNpwA9FqDHFyTiC+D8QZw/5N3r4Q9hOSF8gRC+nCD+YC7+QIhANHz8gZAXeC7S6+EOf8Yd\n4/Po6+N+fmB7d5zPoq97wsf/pe36OXaVPwg5ub0eoUPPgTzvbNIXgNbtsOJp799Lb3nFHw6I4irv\nuWgU+Affr9XBV7FIvHw+r60hb1hqDscxRnWM9BweQN2dB8Mk3NlBR8d+2jva6ezooKOjna7OdsKd\nHXR1dtDd1U53uJPurk4i4Q56wp247i5cd6e3v+4u6AnjC3fii4QJuDABwgRtP0G6CRKOPncTNO91\nILo8xyJE8BHBAMPhw5n3jBkOA/PhzIdFX2M+ry8vPsznvTfzYWaYL/ra5z185sN8fsC8MD+wfe/X\nmBdc+aVeZ4HDflEf55d37/dHW+/Avvwh799BX3TsgV2bYNdG2LUh+rwRPlgKK/94+GVKX47XU+7I\ns4gDrwfo2YSCQCTVfH7vcZReUYHoozABh3HO0dkdoa2zm7bOHlo7u2nr6mZ79H1bZ7e3rLOb1q5u\n9nf20BHuoaM7QntX9HW4h/boozMcoT3cQ0eX9z6efiZ+n5EX8JMb8JMb8B18nRfwkxv0k5vjIxTw\nE8rxEczxHXr2e8uD/sOXe6/9hy/z+8jN8RH0e+uH/D6CPu+RY0afL6TlDoWTpniPI0V6YO/WQ+Gw\ns1dQxHQ20Ssk0ng2oSAQyVBmFv2F62f4kMTu+0DIHAiH9l6h0dHVQ0d3D+1dkUPLeodKV4SO7kOB\ncmD53vYw27t66OqJ0Bk+8ByhsydCV3diRqz3GYeFR9DvIxSIPvdeHv0smOMj4D/w3g57H4hu472v\nJOAfS7DMR3DkofXyelopaN9KQdsW8lq3EGrdQnDvZnK2LsG/8o9YLGcTY86BIWUJ+fmPRUEgIn3W\nO2SGkvzxoJxzdEUDoas7Qmf0+UBYdPX0HBYaBz/vjtDZ3XP4dr2D5ijr7u/qZtf+COGeCOEed/A4\nXd3esq7uyGH3psSmCJgcfXj89DCSnYzxNXGKNVHpb+KUXc2M2bWFUTQwjH0ArL7oQao/cmXCvsuj\nURCIyIBnZoRy/ANmfKlIxAum8MGAOEpg9EQId3vhFI5+dmD9rh53aFn0eVdPhO3dEV6NruPv2kdR\n+1aurDgr6T+PgkBEpI98PiPX550RZYJ0Tl4vIiIDgIJARCTLKQhERLKcgkBEJMspCEREspyCQEQk\nyykIRESynIJARCTLDYoZysysGdgU5+alQEsCyxns9H0cou/icPo+DpcJ38cpzrkTDlQ0KIKgP8ys\nIZap2rKFvo9D9F0cTt/H4bLp+9ClIRGRLKcgEBHJctkQBHPTXcAAo+/jEH0Xh9P3cbis+T4yvo1A\nRESOLxvOCERE5DgyOgjM7BIzW21m75nZ7emuJ13MbLSZzTezFWb2rpl9I901DQRm5jezt83sT+mu\nJd3MbJiZzTOzVWa20szOTndN6WJmt0T/nyw3s0fN7MOTS2eYjA0CM/MDPwc+AUwCPmtmk9JbVdp0\nA99yzk0CZgJfzeLvordvACvTXcQA8RPgr865GmAqWfq9mNko4OtArXPuNMAPXJPeqpIvY4MAOAt4\nzzm33jnXBTwGzEpzTWnhnPvAOfdW9PU+vP/ko9JbVXqZWQVwGfDrdNeSbmY2FPgocB+Ac67LObc7\nvVWlVQ6QZ2Y5QD7wfprrSbpMDoJRwJZe7xvJ8l9+AGZWCZwBvJ7eStLux8BtQCTdhQwAVUAz8ED0\nUtmvzawg3UWlg3NuK3A3sBn4ANjjnHs+vVUlXyYHgRzBzIYATwLfdM7tTXc96WJmnwSanHOL013L\nAJEDnAn80jl3BtAGZGWbmpkV4105qAJOBgrM7Lr0VpV8mRwEW4HRvd5XRJdlJTML4IXAI865p9Jd\nT5qdC1xuZhvxLhleYGa/TW9JadUINDrnDpwlzsMLhmx0EbDBOdfsnAsDTwHnpLmmpMvkIHgTGG9m\nVWYWxGvweSbNNaWFmRne9d+Vzrn/le560s05d4dzrsI5V4n37+Il51zG/9V3LM65bcAWM6uOLroQ\nWJHGktJpMzDTzPKj/28uJAsaznPSXUCyOOe6zeyfgOfwWv7vd869m+ay0uVc4HpgmZktiS77jnPu\n2TTWJAPL14BHon80rQe+mOZ60sI597qZzQPewutt9zZZcIex7iwWEclymXxpSEREYqAgEBHJcgoC\nEZEspyAQEclyCgIRkSynIBBJMjOr0winMpApCEREspyCQCTKzK4zszfMbImZ/d/ofAWtZva/o+PT\nv2hmZdF1p5nZIjN7x8x+Hx2jBjM71cxeMLOlZvaWmY2L7n5Ir/H+H4netSoyICgIRAAzmwjMAc51\nzk0DeoBrgQKgwTk3GVgIfC+6ycPAt51zU4BlvZY/AvzcOTcVb4yaD6LLzwC+iTc3xli8u71FBoSM\nHWJCpI8uBKYDb0b/WM8DmvCGqf5ddJ3fAk9Fx+8f5pxbGF3+EPCEmRUCo5xzvwdwznUARPf3hnOu\nMfp+CVAJvJL8H0vkxBQEIh4DHnLO3XHYQrN/OWK9eMdk6ez1ugf935MBRJeGRDwvAleZWTmAmZWY\n2Sl4/0euiq7zOeAV59weYJeZnRddfj2wMDr7W6OZXRHdR8jM8lP6U4jEQX+ViADOuRVm9l3geTPz\nAWHgq3iTtJwV/awJrx0B4Abg3ugv+t6jdV4P/F8z+9foPman8McQiYtGHxU5DjNrdc4NSXcdIsmk\nS0MiIllOZwQiIllOZwQiIllOQSAikuUUBCIiWU5BICKS5RQEIiJZTkEgIpLl/j+Mr7zpvVK9ygAA\nAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fe4696a1470>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epochs = [x[0] for x in all_losses]\n",
    "plt.plot(epochs, [x[1] for x in all_losses], label='train');\n",
    "plt.plot(epochs, [x[2] for x in all_losses], label='val');\n",
    "plt.legend();\n",
    "plt.xlabel('epoch');\n",
    "plt.ylabel('loss');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fe423f8a400>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(epochs, [x[3] for x in all_losses], label='train');\n",
    "plt.plot(epochs, [x[4] for x in all_losses], label='val');\n",
    "plt.legend();\n",
    "plt.xlabel('epoch');\n",
    "plt.ylabel('accuracy');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nfx3hF60AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fe423f8a9e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(epochs, [x[5] for x in all_losses], label='train');\n",
    "plt.plot(epochs, [x[6] for x in all_losses], label='val');\n",
    "plt.legend();\n",
    "plt.xlabel('epoch');\n",
    "plt.ylabel('top5_accuracy');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Save"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.cpu();\n",
    "torch.save(model.state_dict(), 'model_ternary_quantization.pytorch_state')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
